boto3を使用してセキュリティグループのインバウンドルールを編集するpythonファイルを作ってみた
こんにちは。DA事業本部の下地です。
最近セキュリティグループ(sg)のインバウンドルールへの追加や削除を行う機会が増えてきましたので、コマンドライン引数で必要な情報を渡してインバウンドルールの編集を行うpythonファイルを作りたいと思います。
環境
実行環境は下記のようになります。
- MacOS: Catalina 10.15.4
- Python: 3.7.0
- Boto3: 1.12.33
インバウンドルールの追加と削除
sgのインバウンドの追加と削除にはAWS SDK for Python (boto3)を使用します。boto3には“Client API” と “Resource API”の2種類が用意されています。違いについては弊社ブログにて(AWS SDK for Python (Boto3) の “Client API” と “Resource API” の違いについて調べてみた)まとめられておりますので興味のある方は合わせてお読みください。
コマンドライン引数の取得
pythonプログラム実行時に引数を渡すことができます。確認のため以下の内容でget_argument.py
を作成します。
import sys args = sys.argv print(args[0]) print(args[1]) print(args[2]) print(args[3])
実行時に3つの引数を入力します。
$ python get_argument.py 22 0.0.0.0/0 description get_argument.py 22 0.0.0.0/0 description
args[0]には実行したファイル名が入るので、入力した引数はargs[1]~args[3]で取得することができそうです。
インバウンドルール編集を行うファイルの作成
では、インバウンドルールの追加・削除を行うedit_security_group.py
ファイルを作成します。実行時に、ポート、CidrIp、詳細の3つを引数に受け取り処理します。
受け取ったポート番号とCidrIpを用いて、同一のインバウンドルールがないか確認し存在したら削除、存在しない場合は追加を行います。
import sys from boto3.session import Session security_id = 'sg-*****************' profile_name = "****" def main(args): session = Session(profile_name=profile_name) client = session.client("ec2") try: port = int(args[1]) cidr_ip = args[2] description = args[3] #sgの詳細情報を取得 status = client.describe_security_groups(GroupIds=[security_id,]) #同一インバウンドルールの確認 flg = [1 for sg in status['SecurityGroups'][0]['IpPermissions'] if sg['FromPort'] == port and sg['IpRanges'][0]['CidrIp'] == cidr_ip] #同一インバウンドルールがある場合は削除、ない場合は追加処理を行う if flg: print("deleted inbound rules") delete_ingress = client.revoke_security_group_ingress( CidrIp=cidr_ip, FromPort=port, GroupId=security_id, IpProtocol='TCP', ToPort=port, ) else: print("added inbound rules") authorize_ssh = client.authorize_security_group_ingress( GroupId=security_id, IpPermissions=[ { 'FromPort': port, 'IpProtocol': 'tcp', 'IpRanges': [ { 'CidrIp': cidr_ip, 'Description': description, }, ], 'ToPort': port, }, ], ) except Exception as e: print("error") print(e) raise e if __name__ == '__main__': args = sys.argv main(args)
追加と削除の確認
スクリプトが作成できましたので実装します。
実行前はインバウンドルールは設定されておりません。
では追加します。
$ python edit_security_group.py 22 0.0.0.0/0 set_from_boto3 added inbound rules $ python edit_security_group.py 3389 0.0.0.0/0 set_from_boto3 added inbound rules
コンソール画面から追加されていることを確認しました。
では次に同一のインバウンドルールがある場合は削除されるか確認します。
$ python edit_security_group.py 3389 0.0.0.0/0 set_from_boto3 deleted inbound rules
コンソール画面を見ると削除されていることがわかりました。
まとめ
pythonファイル実行時にコマンドライン引数を与えることで、sgのインバウンドルールの追加・削除ができるようになりました。コンソール画面にいかずとも処理できるのは便利だなと実感しました。この記事がどなたかの助けになれば幸いです。